home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
magic
/
i
/
magicvdi.i
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
MacRoman (detected)
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
Modula Implementation
|
1997-10-26
|
36.4 KB
|
1,400 lines
(*----------------------------------------------------------------------*
* *
* MAGIC Modula's All purpose GEM Interface Cadre *
* ÿ ÿ ÿ ÿ ÿ *
*----------------------------------------------------------------------*
* Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
*----------------------------------------------------------------------*
* Dieses Modul ist urheberrechtlich geschtzt. *
* *
* Die Verffentlichung des Quelltextes oder Teilen daraus in schrift- *
* licher Form, insbesondere in Zeitschriften, sowie die Verbreitung *
* ber Public-Domain-Hndler bedarf der ausdrcklichen schriftlichen *
* Genehmigung des Autors! *
* *
* Der Autor gibt hiermit die ausdrckliche Erlaubnis, das Modul jeder- *
* zeit auch im Quelltext weiterzugegeben, sofern dessen Text und ins- *
* besondere dieser Urheberrechts-Vermerk nicht verndert wird, und *
* durch die Weitergabe kein finanzieller Nutzen entsteht. Der Autor *
* behlt sich das Recht vor, diese Erlaubnis jederzeit u. ohne Angaben *
* von Grnden zu widerrufen. *
*----------------------------------------------------------------------*)
IMPLEMENTATION MODULE MagicVDI;
(*----------------------------------------------------------------------*
* Int. Vers | Datum | Name | nderung *
*-----------+----------+------+----------------------------------------*
* 3.00 | 18.01.92 | Hp | *
* 3.01 | 29.01.92 | Hp | Routinen optimiert *
*-----------+----------+------+----------------------------------------*)
(* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
(* *)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*----------------------------------------------*)
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
CastToChar, CastToByte, CastToByteset, CastToInt,
CastToCard, CastToBitset, CastToWord, CastToLInt,
CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
TosVersion, Accessory, Basepage, SysHeader, TosDate;
IMPORT SYSTEM, MagicSys;
VAR array: POINTER TO ARRAY [0..MAX(INTEGER)] OF sINTEGER;
vdipb: SYSTEM.ADDRESS; (* Adresse des VDI-Parameterblocks *)
PROCEDURE VDICall (c0, c1, c3, c5, c6: sINTEGER);
BEGIN
VDIControl[0]:= c0;
VDIControl[1]:= c1;
VDIControl[3]:= c3;
VDIControl[5]:= c5;
VDIControl[6]:= c6;
MagicSys.CallGEM (115, vdipb);
END VDICall;
PROCEDURE fillIntin (REF string: ARRAY OF CHAR; VAR adr: SYSTEM.ADDRESS; VAR len: sINTEGER);
(* Fllt das IntIn-Array, alloziert ggf. einen neuen Speicherblock
* dafr und gibt die Adresse zurck
*)
VAR h : sCARDINAL;
c : sCARDINAL;
a : SYSTEM.ADDRESS;
BEGIN
h:= HIGH(string);
SYSTEM.ASSEMBLER
MOVEQ #0,D0
MOVE.W h(A6),D1
MOVEQ #0,D2
MOVE.L string(A6),A0
LEA VDIIntIn,A1
MOVE.L A1,a(A6)
loop:
MOVE.B (A0)+,D2
MOVE.W D2,(A1)+
BEQ.S exit
ADDQ.W #1,D0
CMPI.W #511,D0 (* VDIIntIn voll? *)
BEQ.S mist (* BEQ, da die Schleife auch spter wieder angesprungen wird, wenn D0 grer ist! *)
SUBQ.W #1,D1
BNE.S loop
exit:
BRA.S end
mist:
; Jetzt erstmal die Lnge feststellen
MOVE.L A0,A2
MOVE.W D0,D2
lm:
ADDQ.W #1,D2
TST.B (A2)+
BNE.S lm
lmend:
; Lnge steht nun in D2
; Speicher fr neues VDIIntIn beim GEMDOS anfordern
MOVEM.L D0-D1/A0-A1/A3-A6,-(SP)
LSL.W #1,D2 ; * 2 fr Integer
MOVE.L D2,-(SP)
MOVE.W #72, -(SP)
TRAP #1
ADDQ.L #6, SP
MOVE.L D0,A2
BEQ.S fail ; kein Speicher mehr frei! Wir machen ganu normal weiter
MOVE.L D0,a(A6)
MOVEM.L (SP)+,D0-D1/A0-A1/A3-A6
; Jetzt VDIIntIn nochmal kopieren
LEA VDIIntIn,A1
MOVE.W D0,D2
EXT.L D2
SUBQ.W #1,D2
lm2:
MOVE.W (A1)+,(A2)+
DBRA D2, lm2
; So, jetzt ist das Array kopiert.
; Jetzt mssen wir noch ein paar Register wiederherstellen und knnen dann in Loop
; weitermachen
MOVE.L A2,A1
fail:
MOVEQ #0,D2
SUBQ.W #1,D1
BNE.S loop
end:
MOVE.W D0,c(A6)
END;
adr := a;
len := c;
END fillIntin;
PROCEDURE freeIntin (a: SYSTEM.ADDRESS);
BEGIN
SYSTEM.ASSEMBLER
LEA VDIIntIn,A0
MOVE.L a(A6),A1
CMPA.L A0,A1
BEQ.S exit
; Mfree fr a aufrufen
MOVE.L A1, -(SP)
MOVE.W #73, -(SP)
TRAP #1
ADDQ.L #6, SP
exit:
END;
VDIPB.intin := SYSTEM.ADR(VDIIntIn);
END freeIntin;
PROCEDURE VqGdos(): lCARDINAL;
BEGIN
RETURN MagicSys.VqGdos ();
END VqGdos;
PROCEDURE SetWritemode (handle, mode: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= mode;
VDICall (32, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetWritemode;
PROCEDURE SetColor (handle, index: sINTEGER; VAR rgb: ARRAY OF LOC);
BEGIN
VDIIntIn[0]:= index;
array:= SYSTEM.ADR (rgb);
VDIIntIn[1]:= array^[0];
VDIIntIn[2]:= array^[1];
VDIIntIn[3]:= array^[2];
VDICall(14, 0, 4, 0, handle);
END SetColor;
PROCEDURE SetLinetype (handle, style: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= style;
VDICall (15, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetLinetype;
PROCEDURE SetUserlinestyle (handle: sINTEGER; REF style: ARRAY OF LOC);
BEGIN
VDIIntIn[0]:= CastToInt (style);
VDICall (113, 0, 1, 0, handle);
END SetUserlinestyle;
PROCEDURE SetLinewidth (handle, width: sINTEGER): sINTEGER;
BEGIN
VDIPtsIn[0]:= width;
VDIPtsIn[1]:= 0;
VDICall (16, 1, 0, 0, handle);
RETURN VDIPtsOut[0];
END SetLinewidth;
PROCEDURE SetLinecolor (handle, color: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= color;
VDICall (17, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetLinecolor;
PROCEDURE SetLineEndstyles (handle, begin, end: sINTEGER);
BEGIN
VDIIntIn[0]:= begin;
VDIIntIn[1]:= end;
VDICall (108, 0, 2, 0, handle);
END SetLineEndstyles;
PROCEDURE SetMarkertype (handle, type: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= type;
VDICall (18, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetMarkertype;
PROCEDURE SetMarkerheight (handle, height: sINTEGER): sINTEGER;
BEGIN
VDIPtsIn[0]:= height;
VDIPtsIn[1]:= 0;
VDICall (19, 1, 0, 0, handle);
RETURN VDIPtsOut[0];
END SetMarkerheight;
PROCEDURE SetMarkercolor (handle, index: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= index;
VDICall (20, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetMarkercolor;
PROCEDURE SetCharheight (handle, hi: sINTEGER; VAR cw, ch, bw, bh: sINTEGER);
BEGIN
VDIPtsIn[0]:= 0;
VDIPtsIn[1]:= hi;
VDICall (12, 1, 0, 0, handle);
cw:= VDIPtsOut[0];
ch:= VDIPtsOut[1];
bw:= VDIPtsOut[2];
bh:= VDIPtsOut[3];
END SetCharheight;
PROCEDURE SetCharpoints (handle, hi: sINTEGER; VAR cw, ch, bw, bh: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= hi;
VDICall (107, 0, 1, 0, handle);
cw:= VDIPtsOut[0];
ch:= VDIPtsOut[1];
bw:= VDIPtsOut[2];
bh:= VDIPtsOut[3];
RETURN VDIIntOut[0];
END SetCharpoints;
PROCEDURE SetCharbaseline (handle, angle: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= angle;
VDICall (13, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetCharbaseline;
PROCEDURE SetTextface (handle, font: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= font;
VDICall (21, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetTextface;
PROCEDURE SetTextcolor (handle, index: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= index;
VDICall (22, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetTextcolor;
PROCEDURE SetTexteffect (handle: sINTEGER; effect: sBITSET): sBITSET;
BEGIN
VDIIntIn[0]:= CastToInt (effect);
VDICall (106, 0, 1, 0, handle);
RETURN CastToBitset (VDIIntOut[0]);
END SetTexteffect;
PROCEDURE SetTextalignment (handle, hin, vin: sINTEGER; VAR ho, vo: sINTEGER);
BEGIN
VDIIntIn[0]:= hin;
VDIIntIn[1]:= vin;
VDICall (39, 0, 2, 0, handle);
ho:= VDIIntOut[0];
vo:= VDIIntOut[1];
END SetTextalignment;
PROCEDURE SetFillinterior (handle, index: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= index;
VDICall (23, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetFillinterior;
PROCEDURE SetFillstyle (handle, style: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= style;
VDICall (24, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetFillstyle;
PROCEDURE SetFillcolor (handle, index: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= index;
VDICall (25, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END SetFillcolor;
PROCEDURE SetFillperimeter (handle: sINTEGER; border: BOOLEAN): BOOLEAN;
BEGIN
IF border THEN VDIIntIn[0]:= 1; ELSE VDIIntIn[0]:= 0; END;
VDICall (104, 0, 1, 0, handle);
RETURN VDIIntOut[0] = 1;
END SetFillperimeter;
PROCEDURE SetUserfillpattern (handle: sINTEGER; VAR pat: ARRAY OF LOC;
planes: sINTEGER);
VAR old: SYSTEM.ADDRESS;
BEGIN
old:= VDIPB.intin;
VDIPB.intin:= SYSTEM.ADR (pat);
VDICall (112, 0, planes * 16, 0, handle);
VDIPB.intin:= old;
END SetUserfillpattern;
PROCEDURE OpenWorkstation (VAR in: ARRAY OF LOC; VAR handle: sINTEGER;
VAR out: ARRAY OF LOC);
VAR c: sINTEGER;
BEGIN
array:= SYSTEM.ADR (in);
FOR c:= 0 TO 10 DO VDIIntIn[c]:= array^[c]; END;
VDICall(1, 0, 11, 0, handle);
handle:= VDIControl[6];
array:= SYSTEM.ADR (out);
FOR c:= 0 TO 44 DO array^[c]:= VDIIntOut[c]; END;
FOR c:= 0 TO 11 DO array^[c+44]:= VDIPtsOut[c]; END;
END OpenWorkstation;
PROCEDURE CloseWorkstation (handle: sINTEGER);
BEGIN
VDICall(2, 0, 0, 0, handle);
END CloseWorkstation;
PROCEDURE OpenVirtual (VAR in: ARRAY OF LOC; VAR handle: sINTEGER;
VAR out: ARRAY OF LOC);
VAR c: sINTEGER;
BEGIN
array:= SYSTEM.ADR (in);
FOR c:= 0 TO 10 DO VDIIntIn[c]:= array^[c]; END;
VDICall(100, 0, 11, 0, handle);
handle:= VDIControl[6];
array:= SYSTEM.ADR (out);
FOR c:= 0 TO 44 DO array^[c]:= VDIIntOut[c]; END;
FOR c:= 0 TO 11 DO array^[c+45]:= VDIPtsOut[c]; END;
END OpenVirtual;
PROCEDURE CloseVirtual (handle: sINTEGER);
BEGIN
VDICall(101, 0, 0, 0, handle);
END CloseVirtual;
PROCEDURE ClearWorkstation (handle: sINTEGER);
BEGIN
VDICall(3, 0, 0, 0, handle);
END ClearWorkstation;
PROCEDURE UpdateWorkstation (handle: sINTEGER);
BEGIN
VDICall(4, 0, 0, 0, handle);
END UpdateWorkstation;
PROCEDURE LoadFonts (handle, select: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= select;
VDICall(119, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END LoadFonts;
PROCEDURE UnloadFonts (handle, select: sINTEGER);
BEGIN
VDIIntIn[0]:= select;
VDICall(120, 0, 1, 0, handle);
END UnloadFonts;
PROCEDURE SetClipping (handle: sINTEGER; VAR rect: ARRAY OF LOC; do: BOOLEAN);
BEGIN
array:= SYSTEM.ADR(rect);
VDIPtsIn[0]:= array^[0];
VDIPtsIn[1]:= array^[1];
VDIPtsIn[2]:= array^[2];
VDIPtsIn[3]:= array^[3];
IF do THEN VDIIntIn[0]:= 1; ELSE VDIIntIn[0]:= 0; END;
VDICall(129, 2, 1, 0, handle);
END SetClipping;
PROCEDURE InqCharcells (handle: sINTEGER; VAR rows, colums: sINTEGER);
BEGIN
VDICall (5, 0, 0, 1, handle);
rows:= VDIIntOut[0];
colums:= VDIIntOut[1];
END InqCharcells;
PROCEDURE ExitAlphamode (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 2, handle);
END ExitAlphamode;
PROCEDURE EnterAlphamode (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 3, handle);
END EnterAlphamode;
PROCEDURE AcursorUp (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 4, handle);
END AcursorUp;
PROCEDURE AcursorDown (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 5, handle);
END AcursorDown;
PROCEDURE AcursorRight (handle : sINTEGER);
BEGIN
VDICall (5, 0, 0, 6, handle);
END AcursorRight;
PROCEDURE AcursorLeft (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 7, handle);
END AcursorLeft;
PROCEDURE HomeAcursor (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 8, handle);
END HomeAcursor;
PROCEDURE EraseEOS (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 9, handle);
END EraseEOS;
PROCEDURE EraseEOL (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 10, handle);
END EraseEOL;
PROCEDURE AcursorAddress (handle, row, column: sINTEGER);
BEGIN
VDIIntIn[0]:= row;
VDIIntIn[1]:= column;
VDICall (5, 0, 2, 11, handle);
END AcursorAddress;
PROCEDURE CursorText (handle: sINTEGER; REF string: ARRAY OF CHAR);
VAR h: sINTEGER;
i: sINTEGER;
a: SYSTEM.ADDRESS;
BEGIN
(*
h:= HIGH(string); i:= 0;
SYSTEM.ASSEMBLER
MOVEQ #0,D0
MOVE.W h(A6),D1
MOVEQ #0,D2
MOVE.L string(A6),A0
LEA VDIIntIn,A1
loop:
MOVE.B (A0)+,D2
MOVE.W D2,(A1)+
BEQ.S exit
ADDQ.W #1,D0
SUBQ.W #1,D1
BNE.S loop
exit:
MOVE.W D0,i(A6)
END;
(*
LOOP
IF (i > h) OR (string[i] = 0C) THEN EXIT END;
VDIIntIn[i]:= ORD(string[i]); INC(i);
END;
*)
*)
fillIntin (string, a, i);
VDIPB.intin := a;
IF (i = 0) THEN RETURN END;
VDICall (5, 0, i, 12, handle);
freeIntin (a);
END CursorText;
PROCEDURE ReverseVideoOn (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 13, handle);
END ReverseVideoOn;
PROCEDURE ReverseVideoOff (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 14, handle);
END ReverseVideoOff;
PROCEDURE InqCursoraddress (handle: sINTEGER; VAR row, column: sINTEGER);
BEGIN
VDICall (5, 0, 0, 15, handle);
row:= VDIIntOut[0];
column:= VDIIntOut[1];
END InqCursoraddress;
PROCEDURE InqTabletstatus (handle: sINTEGER): sINTEGER;
BEGIN
VDICall (5, 0, 0, 16, handle);
RETURN VDIIntOut[0];
END InqTabletstatus;
PROCEDURE Hardcopy (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 17, handle);
END Hardcopy;
PROCEDURE DisplayCursor (handle, x, y: sINTEGER);
BEGIN
VDICall (5, 1, 0, 18, handle);
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
END DisplayCursor;
PROCEDURE RemoveCursor (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 19, handle);
END RemoveCursor;
PROCEDURE FormAdvance (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 20, handle);
END FormAdvance;
PROCEDURE OutputWindow (handle: sINTEGER; VAR pxy: ARRAY OF LOC);
VAR i: sINTEGER;
BEGIN
array:= SYSTEM.ADR(pxy);
FOR i:= 0 TO 3 DO VDIPtsIn[i]:= array^[i]; END;
VDICall (5, 2, 0, 21, handle);
END OutputWindow;
PROCEDURE ClearDisplaylist (handle: sINTEGER);
BEGIN
VDICall (5, 0, 0, 22, handle);
END ClearDisplaylist;
PROCEDURE Bitimagefile (handle: sINTEGER; REF fileName: ARRAY OF CHAR;
aspect, scaling, numPts: sINTEGER;
VAR pxy: ARRAY OF LOC);
VAR (*$Reg*) h: sINTEGER;
(*$Reg*) i: sINTEGER;
BEGIN
VDIIntIn[0]:= aspect;
VDIIntIn[1]:= scaling;
h:= HIGH (fileName);
i:= 0;
LOOP
IF (i > h) OR (fileName [i] = 0C) THEN EXIT END;
VDIIntIn[2+i]:= ORD (fileName[i]);
INC (i);
END; (* LOOP *)
IF (i = 0) THEN RETURN END;
VDIIntIn[i+2]:= 0; (* terminate array properly *)
array:= SYSTEM.ADR (pxy);
VDIPtsIn[0]:= array^[0];
VDIPtsIn[1]:= array^[1];
VDIPtsIn[2]:= array^[2];
VDIPtsIn[3]:= array^[3];
VDICall (5, numPts, 3+i, 23, handle);
END Bitimagefile;
PROCEDURE InqPrinterscan(handle: sINTEGER; VAR gSlice, gPage, size, page, div: sINTEGER);
BEGIN
VDICall (5, 0, 0, 24, handle);
gSlice:= VDIIntOut[0];
gPage:= VDIIntOut[1];
size:= VDIIntOut[2];
page:= VDIIntOut[3];
div:= VDIIntOut[4];
END InqPrinterscan;
PROCEDURE PrintText (handle: sINTEGER; REF string: ARRAY OF CHAR);
VAR h, i: sINTEGER;
a : SYSTEM.ADDRESS;
BEGIN
(*
h:= HIGH(string); i:= 0;
SYSTEM.ASSEMBLER
MOVEQ #0,D0
MOVE.W h(A6),D1
MOVEQ #0,D2
MOVE.L string(A6),A0
LEA VDIIntIn,A1
loop:
MOVE.B (A0)+,D2
MOVE.W D2,(A1)+
BEQ.S exit
ADDQ.W #1,D0
SUBQ.W #1,D1
BNE.S loop
exit:
MOVE.W D0,i(A6)
END;
(*
LOOP
IF (i > h) OR (string[i] = 0C) THEN EXIT END;
VDIIntIn[i]:= ORD(string[i]); INC(i);
END;
*)
*)
fillIntin (string, a, i);
VDIPB.intin := a;
IF (i = 0) THEN RETURN END;
VDICall (5, 0, i, 25, handle);
freeIntin (a);
END PrintText;
PROCEDURE SelectPalette (handle, palette: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= palette;
VDICall (5, 0, 1, 60, handle);
RETURN VDIIntOut[0];
END SelectPalette;
PROCEDURE GenerateTone(handle, freq, time: sINTEGER);
BEGIN
VDIIntIn[0]:= freq;
VDIIntIn[1]:= time;
VDICall (5, 0, 2, 61, handle);
END GenerateTone;
PROCEDURE ToneMultiflag (handle, action: sINTEGER);
BEGIN
VDIIntIn[0]:= action;
VDICall (5, 0, 1, 62, handle);
END ToneMultiflag;
PROCEDURE SetTabletaxisInch (handle, xres, yres: sINTEGER;
VAR xset, yset: sINTEGER);
BEGIN
VDIIntIn[0]:= xres;
VDIIntIn[1]:= yres;
VDICall (5, 0, 2, 81, handle);
xset:= VDIIntIn[0];
yset:= VDIIntIn[1];
END SetTabletaxisInch;
PROCEDURE SetTabletaxisLine (handle, xres, yres: sINTEGER;
VAR xset, yset: sINTEGER);
BEGIN
VDIIntIn[0]:= xres;
VDIIntIn[1]:= yres;
VDICall (5, 0, 2, 82, handle);
xset:= VDIIntIn[0];
yset:= VDIIntIn[1];
END SetTabletaxisLine;
PROCEDURE SetTabletorigin (handle, x, y: sINTEGER);
BEGIN
VDIIntIn[0]:= x;
VDIIntIn[1]:= y;
VDICall (5, 0, 2, 83, handle);
END SetTabletorigin;
PROCEDURE InqTabletorigin (handle: sINTEGER; VAR x, y: sINTEGER);
BEGIN
VDICall (5, 0, 0, 84, handle);
x:= VDIIntIn[0];
y:= VDIIntIn[1];
END InqTabletorigin;
PROCEDURE SetTabletalignment (handle, x, y: sINTEGER);
BEGIN
VDIIntIn[0]:= x;
VDIIntIn[1]:= y;
VDICall (5, 0, 2, 85, handle);
END SetTabletalignment;
PROCEDURE SetFilmtype (handle, index, light: sINTEGER);
BEGIN
VDIIntIn[0]:= index;
VDIIntIn[1]:= light;
VDICall (5, 0, 2, 91, handle);
END SetFilmtype;
PROCEDURE InqFilmname (handle: sINTEGER; VAR filmName: ARRAY OF CHAR);
VAR i: sINTEGER;
BEGIN
VDICall (5, 0, 1, 92, handle);
FOR i:= 0 TO 24 DO filmName[i]:= CHR(VDIIntOut[i]) END;
END InqFilmname;
PROCEDURE SetFilmexposure (handle, state: sINTEGER);
BEGIN
VDIIntIn[0]:= state;
VDICall (5, 0, 1, 93, handle);
END SetFilmexposure;
PROCEDURE UpdateMetafile (handle, minX, minY, maxX, maxY: sINTEGER);
BEGIN
VDIPtsIn[0]:= minX;
VDIPtsIn[1]:= minY;
VDIPtsIn[2]:= maxX;
VDIPtsIn[3]:= maxY;
VDICall (5, 2, 0, 98, handle);
END UpdateMetafile;
PROCEDURE WriteMetafile (handle, numIntin: sINTEGER; VAR intIn: ARRAY OF LOC;
numPtsin: sINTEGER; VAR ptsIn: ARRAY OF LOC);
VAR oldInt, oldPts: SYSTEM.ADDRESS;
BEGIN
oldInt:= VDIPB.intin;
oldPts:= VDIPB.ptsin;
VDIPB.intin:= SYSTEM.ADR (intIn);
VDIPB.ptsin:= SYSTEM.ADR (ptsIn);
VDICall (5, numPtsin, numIntin, 99, handle);
VDIPB.intin:= oldInt;
VDIPB.ptsin:= oldPts;
END WriteMetafile;
PROCEDURE PhysicalPagesize (handle, width, height: sINTEGER);
BEGIN
VDIIntIn[0]:= 0;
VDIIntIn[1]:= width;
VDIIntIn[2]:= height;
VDICall (5, 0, 3, 99, handle);
END PhysicalPagesize;
PROCEDURE CoordinateWindow (handle, llx, lly, urx, ury: sINTEGER);
BEGIN
VDIIntIn[0]:= 1;
VDIIntIn[1]:= llx;
VDIIntIn[2]:= lly;
VDIIntIn[3]:= urx;
VDIIntIn[4]:= ury;
VDICall (5, 0, 5, 99, handle);
END CoordinateWindow;
PROCEDURE ChangeVdiFilename (handle: sINTEGER; REF fileName: ARRAY OF CHAR);
VAR (*$Reg*) h: sINTEGER;
(*$Reg*) i: sINTEGER;
BEGIN
h:= HIGH(fileName); i:= 0;
LOOP
IF (i > h) OR (fileName [i] = 0C) THEN EXIT END;
VDIIntIn[i]:= ORD (fileName[i]); INC (i);
END; (* LOOP *);
IF (i = 0) THEN RETURN END;
VDIIntIn[i]:= 0;
VDICall (5, 0, i, 100, handle);
END ChangeVdiFilename;
PROCEDURE SetLineoffset (handle, offset: sINTEGER);
BEGIN
VDIIntIn[0]:= offset;
VDICall (5, 0, 1, 101, handle);
END SetLineoffset;
PROCEDURE InitSystemfont (handle: sINTEGER; VAR header: ARRAY OF LOC);
BEGIN
array:= SYSTEM.ADR (header);
VDIIntIn[0]:= array^[0];
VDIIntIn[1]:= array^[1];
VDICall (5, 0, 2, 102, handle);
END InitSystemfont;
VAR old: SYSTEM.ADDRESS;
trick: POINTER TO SYSTEM.ADDRESS;
PROCEDURE SetInputmode (handle, device, mode: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= device;
VDIIntIn[1]:= mode;
VDICall(33, 0, 2, 0, handle);
RETURN VDIIntOut[0];
END SetInputmode;
PROCEDURE InputLocatorRQ (handle, x, y: sINTEGER; VAR xo, yo: sINTEGER; VAR term: CHAR);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDICall(28, 1, 0, 0, handle);
xo:= VDIPtsOut[0];
yo:= VDIPtsOut[1];
term:= CHR(VDIIntOut[0]);
END InputLocatorRQ;
PROCEDURE InputLocatorSM (handle, x, y: sINTEGER; VAR xo, yo: sINTEGER;
VAR term: CHAR): sBITSET;
VAR bs: sBITSET;
l: lCARDINAL;
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIControl[0]:= 28;
VDIControl[1]:= 1;
VDIControl[3]:= 0;
VDIControl[5]:= 0;
VDIControl[6]:= handle;
MagicSys.CallGEM (115, vdipb);
SYSTEM.ASSEMBLER MOVE.L D0, l(A6) END;
xo:= VDIPtsOut[0];
yo:= VDIPtsOut[1];
term:= CHR(VDIIntOut[0]);
bs:= CastToBitset (l);
RETURN bs;
END InputLocatorSM;
PROCEDURE InputValuatorRQ (handle, in: sINTEGER; VAR out: sINTEGER; VAR term: CHAR);
BEGIN
VDIIntIn[0] := in;
VDICall (29, 0, 1, 0, handle);
out:= VDIIntOut[0];
term:= CHR(VDIIntOut[1]);
END InputValuatorRQ;
PROCEDURE InputValuatorSM (handle, in: sINTEGER; VAR out: sINTEGER;
VAR term: CHAR): sBITSET;
BEGIN
VDIIntIn[0] := in;
VDICall (29, 0, 1, 0, handle);
out:= VDIIntOut[0];
term:= CHR(VDIIntOut[1]);
RETURN CastToBitset (VDIControl[4]);
END InputValuatorSM;
PROCEDURE InputChoiceRQ (handle, in: sINTEGER; VAR out: sINTEGER);
BEGIN
VDIIntIn[0] := in;
VDICall (30, 0, 1, 0, handle);
out:= VDIIntOut[0];
END InputChoiceRQ;
PROCEDURE InputChoiceSM (handle: sINTEGER; VAR choice: sINTEGER ): sINTEGER;
BEGIN
VDICall (30, 0, 0, 0, handle);
choice:= VDIIntOut [0];
RETURN VDIControl[4];
END InputChoiceSM;
PROCEDURE InputStringRQ (handle, len: sINTEGER; echo: BOOLEAN;
VAR xy: ARRAY OF LOC;
VAR string: ARRAY OF CHAR);
VAR (*$Reg*) h: sINTEGER;
(*$Reg*) i: sINTEGER;
BEGIN
VDIIntIn[0]:= len;
IF echo THEN VDIIntIn[1]:= 1; ELSE VDIIntIn[1]:= 0; END;
array:= SYSTEM.ADR(xy);
VDIPtsIn[0]:= array^[0];
VDIPtsIn[1]:= array^[1];
VDICall (31, 1, 2, 0, handle);
h:= VDIControl[4] - 1;
FOR i:= 0 TO h DO string[i]:= CHR(VDIIntOut[i]) END;
string [h + 1]:= 0C;
END InputStringRQ;
PROCEDURE InputStringSM (handle, len: sINTEGER; echo: BOOLEAN;
VAR xy: ARRAY OF LOC;
VAR string: ARRAY OF CHAR): sINTEGER;
VAR (*$Reg*) h: sINTEGER;
(*$Reg*) i: sINTEGER;
BEGIN
VDIIntIn[0]:= len;
IF echo THEN VDIIntIn[1]:= 1; ELSE VDIIntIn[1]:= 0; END;
array:= SYSTEM.ADR(xy);
VDIPtsIn[0]:= array^[0];
VDIPtsIn[1]:= array^[1];
VDICall (31, 1, 2, 0, handle);
h:= VDIControl[4] - 1;
FOR i:= 0 TO h DO string[i]:= CHR(VDIIntOut[i]) END;
string [h + 1]:= 0C;
RETURN VDIControl[4];
END InputStringSM;
PROCEDURE SetMouseform (handle: sINTEGER; VAR form: ARRAY OF LOC);
BEGIN
old:= VDIPB.intin;
VDIPB.intin:= SYSTEM.ADR (form);
VDICall (111, 0, 37, 0, handle);
VDIPB.intin:= old;
END SetMouseform;
PROCEDURE ShowCursor (handle: sINTEGER; reset: BOOLEAN);
BEGIN
IF reset THEN VDIIntIn[0]:= 0; ELSE VDIIntIn[0]:= 1; END;
VDICall (122, 0, 1, 0, handle);
END ShowCursor;
PROCEDURE HideCursor (handle: sINTEGER);
BEGIN
VDICall (123, 0, 0, 0, handle);
END HideCursor;
PROCEDURE SampleMouse (handle: sINTEGER; VAR stat: sBITSET; VAR x, y: sINTEGER);
BEGIN
VDICall (124, 0, 0, 0, handle);
stat:= CastToBitset (VDIIntOut[0]);
x:= VDIPtsOut[0];
y:= VDIPtsOut[1];
END SampleMouse;
PROCEDURE ExTimerVector (handle: sINTEGER; new: SYSTEM.ADDRESS;
VAR intervall: sINTEGER): SYSTEM.ADDRESS;
BEGIN
trick:= SYSTEM.ADR (VDIControl[7]); trick^:= new;
VDICall (118, 0, 0, 0, handle);
intervall:= VDIIntOut[0];
trick:= SYSTEM.ADR (VDIControl[9]);
RETURN trick^;
END ExTimerVector;
PROCEDURE ExButtonVector (handle: sINTEGER; new: SYSTEM.ADDRESS): SYSTEM.ADDRESS;
BEGIN
trick:= SYSTEM.ADR (VDIControl[7]); trick^:= new;
VDICall (125, 0, 0, 0, handle);
trick:= SYSTEM.ADR (VDIControl[9]);
RETURN trick^;
END ExButtonVector;
PROCEDURE ExMovementVector (handle: sINTEGER; new: SYSTEM.ADDRESS): SYSTEM.ADDRESS;
BEGIN
trick:= SYSTEM.ADR (VDIControl[7]); trick^:= new;
VDICall (126, 0, 0, 0, handle);
trick:= SYSTEM.ADR (VDIControl[9]);
RETURN trick^;
END ExMovementVector;
PROCEDURE ExCursorVector (handle: sINTEGER; new: SYSTEM.ADDRESS): SYSTEM.ADDRESS;
BEGIN
trick:= SYSTEM.ADR (VDIControl[7]); trick^:= new;
VDICall (127, 0, 0, 0, handle);
trick:= SYSTEM.ADR (VDIControl[9]);
RETURN trick^;
END ExCursorVector;
PROCEDURE SampleKeyboard (handle: sINTEGER; VAR status: sBITSET);
BEGIN
VDICall (128, 0, 0, 0, handle);
status:= CastToBitset (VDIIntOut[0]);
END SampleKeyboard;
PROCEDURE ExtendedInq (handle, wich: sINTEGER; VAR out: ARRAY OF LOC);
VAR i: sINTEGER;
BEGIN
VDIIntIn[0]:= wich;
VDICall (102, 0, 1, 0, handle);
array:= SYSTEM.ADR (out);
FOR i:= 0 TO 44 DO array^[i]:= VDIIntOut[i]; END;
FOR i:= 45 TO 56 DO array^[i]:= VDIPtsOut[i-45]; END;
END ExtendedInq;
PROCEDURE InqColor (handle, color: sINTEGER; set: BOOLEAN; VAR rgb: ARRAY OF LOC);
BEGIN
VDIIntIn[0]:= color;
IF set THEN VDIIntIn[1]:= 0; ELSE VDIIntIn[1]:= 1; END;
VDICall (26, 0, 2, 0, handle);
array:= SYSTEM.ADR(rgb);
array^[0]:= VDIIntOut[1];
array^[1]:= VDIIntOut[2];
array^[2]:= VDIIntOut[3];
END InqColor;
PROCEDURE InqLine (handle: sINTEGER; VAR attrib: ARRAY OF LOC);
BEGIN
VDICall (35, 0, 0, 0, handle);
array:= SYSTEM.ADR(attrib);
array^[0]:= VDIIntOut[0];
array^[1]:= VDIIntOut[1];
array^[2]:= VDIIntOut[2];
array^[3]:= VDIPtsOut[0];
END InqLine;
PROCEDURE InqMarker (handle: sINTEGER; VAR attrib: ARRAY OF LOC);
BEGIN
VDICall (36, 0, 0, 0, handle);
array:= SYSTEM.ADR(attrib);
array^[0]:= VDIIntOut[0];
array^[1]:= VDIIntOut[1];
array^[2]:= VDIIntOut[2];
array^[3]:= VDIPtsOut[1];
END InqMarker;
PROCEDURE InqFill (handle: sINTEGER; VAR attrib: ARRAY OF LOC);
VAR i: sINTEGER;
BEGIN
VDICall (37, 0, 0, 0, handle);
array:= SYSTEM.ADR(attrib);
FOR i:= 0 TO 4 DO array^[i]:= VDIIntOut[i]; END;
END InqFill;
PROCEDURE InqText (handle: sINTEGER; VAR attrib: ARRAY OF LOC);
VAR i: sINTEGER;
BEGIN
VDICall (38, 0, 0, 0, handle);
array:= SYSTEM.ADR(attrib);
FOR i:= 0 TO 5 DO array^[i]:= VDIIntOut[i]; END;
FOR i:= 6 TO 9 DO array^[i]:= VDIPtsOut[i-6]; END;
END InqText;
PROCEDURE InqTextextent (handle: sINTEGER; REF string: ARRAY OF CHAR;
VAR extent: ARRAY OF LOC);
VAR h: sINTEGER;
i: sINTEGER;
a: SYSTEM.ADDRESS;
BEGIN
(*
i:= 0;
h:= HIGH(string);
SYSTEM.ASSEMBLER
MOVEQ #0,D0
MOVE.W h(A6),D1
MOVEQ #0,D2
MOVE.L string(A6),A0
LEA VDIIntIn,A1
loop:
MOVE.B (A0)+,D2
MOVE.W D2,(A1)+
BEQ.S exit
ADDQ.W #1,D0
SUBQ.W #1,D1
BNE.S loop
exit:
MOVE.W D0,i(A6)
END;
(*
LOOP
IF (i > h) OR (string[i] = 0C) THEN EXIT END;
VDIIntIn[i]:= ORD(string[i]); INC (i);
END;
*)
*)
fillIntin (string, a, i);
VDIPB.intin := a;
VDICall (116, 0, i, 0, handle);
array:= SYSTEM.ADR(extent);
FOR i:= 0 TO 7 DO array^[i]:= VDIPtsOut[i]; END;
freeIntin (a);
END InqTextextent;
PROCEDURE InqCharwidth (handle: sINTEGER; ch: CHAR;
VAR width, left, right: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= ORD(ch);
VDICall (117, 0, 1, 0, handle);
width:= VDIPtsOut[0];
left:= VDIPtsOut[2];
right:= VDIPtsOut[4];
RETURN VDIIntOut[0];
END InqCharwidth;
PROCEDURE InqFacename (handle, element: sINTEGER; VAR name: ARRAY OF CHAR): sINTEGER;
VAR i: sINTEGER;
BEGIN
VDIIntIn[0]:= element;
VDICall (130, 0, 1, 0, handle);
FOR i:= 1 TO 32 DO name[i-1]:= CHR(VDIIntOut[i]) END;
RETURN VDIIntOut[0];
END InqFacename;
PROCEDURE InqCellarray (handle: sINTEGER; VAR pxy: ARRAY OF LOC;
len, rows: sINTEGER; VAR elUsed, rowsUsed, status: sINTEGER;
VAR colArray: ARRAY OF LOC);
VAR i: sINTEGER;
BEGIN
array:= SYSTEM.ADR(pxy);
FOR i:= 0 TO 3 DO VDIPtsIn[i]:= array^[i]; END;
VDIControl[7]:= len;
VDIControl[8]:= rows;
old:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (colArray);
VDICall (27, 2, 0, 0, handle);
VDIPB.ptsin:= old;
elUsed:= VDIControl[9];
rowsUsed:= VDIControl[10];
status:= VDIControl[11];
END InqCellarray;
PROCEDURE InqInputmode (handle: sINTEGER; dev: sINTEGER): sINTEGER;
BEGIN
VDIIntIn[0]:= ORD(dev);
VDICall (115, 0, 1, 0, handle);
RETURN VDIIntOut[0];
END InqInputmode;
PROCEDURE InqFaceinfo (handle : sINTEGER; VAR minADE, maxADE, maxWidth: sINTEGER;
VAR dist: ARRAY OF LOC; VAR effects: ARRAY OF LOC);
VAR i: sINTEGER;
BEGIN
VDICall (131, 0, 0, 0, handle);
minADE:= VDIIntOut[0];
maxADE:= VDIIntOut[1];
array:= SYSTEM.ADR(dist);
FOR i:= 0 TO 4 DO array^[i]:= VDIPtsOut[2 * i + 1]; END;
maxWidth:= VDIPtsOut[0];
array:= SYSTEM.ADR(effects);
array^[0]:= VDIPtsOut[2];
array^[1]:= VDIPtsOut[4];
array^[2]:= VDIPtsOut[6];
END InqFaceinfo;
VAR oldPts: SYSTEM.ADDRESS;
oldInt: SYSTEM.ADDRESS;
PROCEDURE Polyline (handle, count: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(6, count, 0, 0, handle);
VDIPB.ptsin:= oldPts;
END Polyline;
PROCEDURE Polymarker (handle, count: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(7, count, 0, 0, handle);
VDIPB.ptsin:= oldPts;
END Polymarker;
PROCEDURE Text (handle, x, y: sINTEGER; REF string: ARRAY OF CHAR);
VAR c: sINTEGER;
h: sCARDINAL;
a: SYSTEM.ADDRESS;
BEGIN
fillIntin (string, a, c);
(*
WHILE (c <= h) AND (string[c] # 0C) DO
VDIIntIn[c]:= ORD(string[c]); INC(c);
END;
*)
VDIPB.intin:= a;
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDICall(8, 1, c, 0, handle);
freeIntin (a);
END Text;
PROCEDURE FilledArea (handle, count: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(9, count, 0, 0, handle);
VDIPB.ptsin:= oldPts;
END FilledArea;
PROCEDURE CellArray (handle, len, used, rows, mode: sINTEGER;
VAR pxy, color: ARRAY OF LOC);
BEGIN
VDIControl[7]:= len;
VDIControl[8]:= used;
VDIControl[9]:= rows;
VDIControl[10]:= mode;
oldPts:= VDIPB.intin;
oldInt:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDIPB.intin:= SYSTEM.ADR (color);
VDICall(10, 2, len * rows, 0, handle);
VDIPB.ptsin:= oldPts;
VDIPB.intin:= oldInt;
END CellArray;
PROCEDURE ContourFill (handle, x, y, index: sINTEGER);
BEGIN
VDIIntIn[0]:= index;
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDICall(103, 1, 1, 0, handle);
END ContourFill;
PROCEDURE FillRectangle (handle: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(114, 2, 0, 0, handle);
VDIPB.ptsin:= oldPts;
END FillRectangle;
PROCEDURE Bar (handle: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(11, 2, 0, 1, handle);
VDIPB.ptsin:= oldPts;
END Bar;
PROCEDURE Arc (handle, x, y, rad, beg, end: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= 0;
VDIPtsIn[3]:= 0;
VDIPtsIn[4]:= 0;
VDIPtsIn[5]:= 0;
VDIPtsIn[6]:= rad;
VDIPtsIn[7]:= 0;
VDIIntIn[0]:= beg;
VDIIntIn[1]:= end;
VDICall(11, 4, 2, 2, handle);
END Arc;
PROCEDURE Pie (handle, x, y, rad, beg, end: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= 0;
VDIPtsIn[3]:= 0;
VDIPtsIn[4]:= 0;
VDIPtsIn[5]:= 0;
VDIPtsIn[6]:= rad;
VDIPtsIn[7]:= 0;
VDIIntIn[0]:= beg;
VDIIntIn[1]:= end;
VDICall(11, 4, 2, 3, handle);
END Pie;
PROCEDURE Circle (handle, x, y, rad: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= 0;
VDIPtsIn[3]:= 0;
VDIPtsIn[4]:= rad;
VDIPtsIn[5]:= 0;
VDICall(11, 3, 0, 4, handle);
END Circle;
PROCEDURE Ellipse (handle, x, y, xrad, yrad: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= xrad;
VDIPtsIn[3]:= yrad;
VDICall(11, 2, 0, 5, handle);
END Ellipse;
PROCEDURE EllipticalArc (handle, x, y, xrad, yrad, beg, end: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= xrad;
VDIPtsIn[3]:= yrad;
VDIIntIn[0]:= beg;
VDIIntIn[1]:= end;
VDICall(11, 2, 2, 6, handle);
END EllipticalArc;
PROCEDURE EllipticalPie (handle, x, y, xrad, yrad, beg, end: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= xrad;
VDIPtsIn[3]:= yrad;
VDIIntIn[0]:= beg;
VDIIntIn[1]:= end;
VDICall(11, 2, 2, 7, handle);
END EllipticalPie;
PROCEDURE RoundedRectangle (handle: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(11, 2, 0, 8, handle);
VDIPB.ptsin:= oldPts;
END RoundedRectangle;
PROCEDURE FilledRoundedRectangle (handle: sINTEGER; pxy: ARRAY OF LOC);
BEGIN
oldPts:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
VDICall(11, 2, 0, 9, handle);
VDIPB.ptsin:= oldPts;
END FilledRoundedRectangle;
PROCEDURE JustifiedText (handle, x, y, len, wspace, cspace: sINTEGER;
REF string: ARRAY OF CHAR);
VAR c, h: CARDINAL;
BEGIN
c:= 0; h:= HIGH(string);
(*
SYSTEM.ASSEMBLER
MOVEQ #0,D0
MOVE.W h(A6),D1
MOVEQ #0,D2
MOVE.L string(A6),A0
LEA VDIIntIn,A1
ADDA.W #4,A1
loop:
MOVE.B (A0)+,D2
MOVE.W D2,(A1)+
BEQ.S exit
ADDQ.W #1,D0
SUBQ.W #1,D1
BNE.S loop
exit:
MOVE.W D0,c(A6)
END;
*)
WHILE (c < h) OR (string[c] # 0C) DO
VDIIntIn[c+2]:= ORD(string[c]); INC (c);
END;
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= len;
VDIPtsIn[3]:= 0;
VDIIntIn[0]:= wspace;
VDIIntIn[1]:= cspace;
VDICall(11, 2, c+2, 10, handle);
END JustifiedText;
VAR ptsIn,
intIn: SYSTEM.ADDRESS;
control7: POINTER TO SYSTEM.ADDRESS;
control9: POINTER TO SYSTEM.ADDRESS;
PROCEDURE CopyRasterOpaque (handle, mode: sINTEGER;
pxy, srcMFDB, destMFDB: ARRAY OF LOC);
BEGIN
VDIIntIn[0]:= mode;
ptsIn:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
control7^:= SYSTEM.ADR (srcMFDB);
control9^:= SYSTEM.ADR (destMFDB);
VDICall(109, 4, 1, 0, handle);
VDIPB.ptsin:= ptsIn;
END CopyRasterOpaque;
PROCEDURE CopyRasterTransparent (handle, mode, cSet, cNotset: sINTEGER;
pxy, srcMFDB, destMFDB: ARRAY OF LOC);
BEGIN
VDIIntIn[0]:= mode;
VDIIntIn[1]:= cSet;
VDIIntIn[2]:= cNotset;
ptsIn:= VDIPB.ptsin;
VDIPB.ptsin:= SYSTEM.ADR (pxy);
control7^:= SYSTEM.ADR (srcMFDB);
control9^:= SYSTEM.ADR (destMFDB);
VDICall(121, 4, 1, 0, handle);
VDIPB.ptsin:= ptsIn;
END CopyRasterTransparent;
PROCEDURE TransformForm (handle: sINTEGER; VAR srcMFDB, destMFDB: ARRAY OF LOC);
BEGIN
control7^:= SYSTEM.ADR (srcMFDB);
control9^:= SYSTEM.ADR (destMFDB);
VDICall(110, 0, 0, 0, handle);
END TransformForm;
PROCEDURE GetPixel (handle, x, y: sINTEGER; VAR index: sINTEGER): BOOLEAN;
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDICall(105, 1, 0, 0, handle);
index:= VDIIntOut[1];
RETURN VDIIntOut[0] = 0;
END GetPixel;
VAR init: sINTEGER;
PROCEDURE InitVDI;
BEGIN
IF init = 0 THEN
VDIPB.control:= SYSTEM.ADR (VDIControl);
VDIPB.intin:= SYSTEM.ADR (VDIIntIn);
VDIPB.ptsin:= SYSTEM.ADR (VDIPtsIn);
VDIPB.intout:= SYSTEM.ADR (VDIIntOut);
VDIPB.ptsout:= SYSTEM.ADR (VDIPtsOut);
vdipb:= SYSTEM.ADR (VDIPB);
control7:= SYSTEM.ADR (VDIControl[7]);
control9:= SYSTEM.ADR (VDIControl[9]);
init:= 30961;
END;
END InitVDI;
BEGIN
init:= 0; InitVDI;
END MagicVDI.